package com.yex.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yex.common.utils.PageUtils;
import com.yex.dao.MessageDao;
import com.yex.entity.MessageEntity;
import com.yex.entity.UserEntity;
import com.yex.service.MessageService;
import com.yex.utils.ApiSms;
import com.yex.utils.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;


@Service("messageService")
public class MessageServiceImpl extends ServiceImpl<MessageDao, MessageEntity> implements MessageService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        Page<MessageEntity> page = this.selectPage(
                new Query<MessageEntity>(params).getPage(),
                new EntityWrapper<MessageEntity>()
        );

        return new PageUtils(page);
    }

    @Override
    @Transactional
    public Integer insertMessage(String mobile, String smgCodeTemplateId, String code, String type, UserEntity userEntity) {
        MessageEntity messageEntity = new MessageEntity();
        messageEntity.setStatus(0);
        if (userEntity != null) {
            messageEntity.setUserId(userEntity.getId());
        } else {
            messageEntity.setUserId(0);
        }
        messageEntity.setCode(code);
        messageEntity.setTemplateId(smgCodeTemplateId);
        messageEntity.setMobile(mobile);
        messageEntity.setCreateTime(new Date());
        messageEntity.setType(Integer.valueOf(type));
        Integer result = baseMapper.insert(messageEntity);

        return result > 0 ? messageEntity.getId() : 0;

    }

    @Override
    public Integer insertOrderMessage(MessageEntity messageEntity) {
        return baseMapper.insert(messageEntity);
    }

    @Override
    @Transactional
    public Integer sendMessage(Integer messageId) {
        MessageEntity messageEntity = baseMapper.selectById(messageId);
        if (messageEntity != null) {
            boolean sms = ApiSms.sendSms(messageEntity.getMobile(), messageEntity.getTemplateId(), messageEntity.getCode());
            if (sms) {
                baseMapper.updateMessageSend(messageId);
            }
            return sms ? 1 : 0;
        }
        return 0;
    }

    @Override
    public MessageEntity selectMessageSendTime(String mobile, String type) {
        return baseMapper.selectMessageSendTime(mobile, type);
    }

    @Override
    public MessageEntity selectMessageSend(String mobile, String code, String type) {
        return baseMapper.selectMessageSend(mobile, code, type);
    }

    @Override
    @Transactional
    public Integer updateMessageVerify(Integer id) {
        return baseMapper.updateMessageVerify(id);
    }

    @Override
    @Transactional
    public Integer updateMessageTask() {
        List<MessageEntity> messageEntityList = baseMapper.selectMessage();
        for (MessageEntity messageEntity : messageEntityList) {
            boolean sms = ApiSms.sendSms(messageEntity.getMobile(), messageEntity.getTemplateId(), messageEntity.getCode());
            if (sms) {
                baseMapper.updateMessageSend(messageEntity.getId());
            }
        }
        return 1;
    }

    @Override
    public MessageEntity selectByMobileAndType(String mobile, Integer templateId, Integer userOrderId) {
        MessageEntity findCondition = new MessageEntity();
        findCondition.setTemplateId(String.valueOf(templateId));
        findCondition.setMobile(mobile);
        findCondition.setUserOrderId(userOrderId);
        findCondition.setStatus(0);
        return baseMapper.selectOne(findCondition);
    }
}
